﻿#include <iostream>
#include <string>

template <class T>
struct spec
{
	template <class I>
	int assgin(T arg1, I arg2) { return sizeof(arg1) + sizeof(arg2); }
};

template <class T>
struct hash{ 
	int operator() () { return sizeof(T); }
};

template <>
struct hash<char> {
	size_t operator() () { return 3; }
};

template <>
struct hash<int> {
	size_t operator() () { return 2; }
};

template <>
struct hash<bool> {
	size_t operator() () { return 1; }
};

int main()
{
	/* hash<int >是类型名字，
		() 是operator()| 第一个小括号
		() 是参数列  | 第二个小括号
	*/
	std::cout << hash<std::string>()() << std::endl;
	std::cout << hash<int >()() << std::endl;
	std::cout << hash<bool >()() << std::endl;
	std::cout << hash<char >()() << std::endl;

	spec<double> d;
	double a = 9;
	std::string str;
	d.assgin(a, str);
	//d.assgin(str, a);//因为函数原型为 assgin(T arg1, I arg2) ，所以第一个T 必须是spec<double> 中指定的double
}

